package com.ape.mapsa.common;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AjaxBehaviorEvent;

import org.apache.log4j.Logger;

import com.ape.mapsa.produccion.constants.TipoMaquina;
import com.ape.mapsa.produccion.model.Confeccion;
import com.ape.mapsa.produccion.model.Impresion;
import com.ape.mapsa.produccion.model.InvRawMaterialsV;
import com.ape.mapsa.produccion.model.Maquina;
import com.ape.mapsa.produccion.model.OrdenProduccion;
import com.ape.mapsa.produccion.service.IProduccionService;

@ManagedBean(name = "prodSpecMB")
@ViewScoped
public class ProdSpecsBean implements Serializable {
	private static final Logger log = Logger.getLogger(ProdSpecsBean.class);
	private static final long serialVersionUID = -5744337830986575883L;

	private Date startDate;
	private Date endDate;
	private Date currentDate;
	private Maquina maquina;

	private List<InvRawMaterialsV> materiaPrimaAutocomp;
	private InvRawMaterialsV materiaPrimaSelec;

	@ManagedProperty(value = "#{produccionService}")
	private IProduccionService produccionService;

	@ManagedProperty(value = "#{userMB}")
	private UserBean userBean;

	@ManagedProperty(value = "#{maqMB}")
	private MaquinasBean maqBean;
	private OrdenProduccion ordenProd;
	private Maquina impMaquina;
	private Maquina confMaquina;

	@PostConstruct
	public void initialize() {
		log.debug("Initializing Prod sepcs bean");
		startDate = new Date();
		currentDate = new Date();
		endDate = new Date();
	}

	public void maquinaDialogClosed() {
		log.debug("Selected maquina: " + maqBean.getSelectedMaquina());
		maquina = maqBean.getSelectedMaquina();
		ordenProd.getExtrusion().setMaquina(maquina);
	}

	public void impMaquinaDialogClosed() {
		log.debug("Selected maquina: " + maqBean.getSelectedMaquina());
		impMaquina = maqBean.getSelectedMaquina();
		ordenProd.getImpresions().setMaquina(impMaquina);
	}

	public void confMaquinaDialogClosed() {
		log.debug("Selected maquina: " + maqBean.getSelectedMaquina());
		confMaquina = maqBean.getSelectedMaquina();
		ordenProd.getConfeccions().setMaquina(confMaquina);
	}

	public void extFechaIniSelected(AjaxBehaviorEvent event) {
		log.debug("Fecha Inicio " + ordenProd.getExtrusion().getFechaInicio());
		ordenProd.getExtrusion().setFechaFin(new Date(ordenProd.getExtrusion().getFechaInicio().getTime() + 1000 * 60 * 30));
		log.debug("Fecha fin " + ordenProd.getExtrusion().getFechaFin());
	}

	public void impFechaIniSelected(AjaxBehaviorEvent event) {
		log.debug("Fecha Inicio " + ordenProd.getImpresions().getFechaInicio());
		ordenProd.getImpresions().setFechaFin(new Date(ordenProd.getImpresions().getFechaInicio().getTime() + 1000 * 60 * 30));
		log.debug("Fecha fin " + ordenProd.getImpresions().getFechaFin());
	}

	public void confFechaIniSelected(AjaxBehaviorEvent event) {
		log.debug("Fecha Inicio " + ordenProd.getConfeccions().getFechaInicio());
		ordenProd.getConfeccions().setFechaFin(new Date(ordenProd.getConfeccions().getFechaInicio().getTime() + 1000 * 60 * 30));
		log.debug("Fecha fin " + ordenProd.getConfeccions().getFechaFin());
	}

	public void extrusionFechaFinSelected(AjaxBehaviorEvent event) {
		if (ordenProd.getImpresions() != null && ordenProd.getImpresions().getId() != null) {
			log.debug("Fecha seleccionada " + ordenProd.getExtrusion().getFechaFin());
			List<Impresion> assignments = produccionService.getImpAssginByType(TipoMaquina.IMPRESORA.getValor());
			if (!assignments.isEmpty()) {
				long maxDate = Long.MAX_VALUE;
				for (Impresion imp : assignments) {
					if (imp.getFechaFin().getTime() < maxDate) {
						ordenProd.getImpresions().setMaquina(imp.getMaquina());
						ordenProd.getImpresions().setFechaInicio(new Date(imp.getFechaFin().getTime() + (1000 * 60 * 30)));
					}
				}
			} else {
				ordenProd.getImpresions().setFechaInicio(new Date(ordenProd.getExtrusion().getFechaFin().getTime() + (1000 * 60 * 30)));
			}
		} else {
			getFirstConfectionMachine(ordenProd.getExtrusion().getFechaFin());
		}

	}

	private void getFirstConfectionMachine(Date date) {
		List<Confeccion> assignments = produccionService.getConfAssginByType(TipoMaquina.CONFECCIONADORA.getValor());
		long maxDate = Long.MAX_VALUE;
		if (!assignments.isEmpty()) {
			for (Confeccion conf : assignments) {
				if (conf.getFechaFin().getTime() < maxDate) {
					ordenProd.getConfeccions().setMaquina(conf.getMaquina());
					ordenProd.getConfeccions().setFechaInicio(new Date(date.getTime() + (1000 * 60 * 30)));
				}
			}
		} else {
			ordenProd.getConfeccions().setFechaInicio(new Date(date.getTime() + (1000 * 60 * 30)));
		}
	}

	public void impresionFechaFinSelected(AjaxBehaviorEvent event) {
		getFirstConfectionMachine(ordenProd.getImpresions().getFechaFin());
	}

	public IProduccionService getProduccionService() {
		return produccionService;
	}

	public void setProduccionService(IProduccionService produccionService) {
		this.produccionService = produccionService;
	}

	public UserBean getUserBean() {
		return userBean;
	}

	public void setUserBean(UserBean userBean) {
		this.userBean = userBean;
	}

	public Date getStartDate() {
		return startDate;
	}

	public void setStartDate(Date startDate) {
		log.debug(startDate);
		this.startDate = startDate;
	}

	public Date getCurrentDate() {
		return currentDate;
	}

	public void setCurrentDate(Date currentDate) {
		this.currentDate = currentDate;
	}

	public Date getEndDate() {
		return endDate;
	}

	public void setEndDate(Date endDate) {
		this.endDate = endDate;
	}

	public Maquina getMaquina() {
		return maquina;
	}

	public void setMaquina(Maquina maquina) {
		this.maquina = maquina;
	}

	public MaquinasBean getMaqBean() {
		return maqBean;
	}

	public void setMaqBean(MaquinasBean maqBean) {
		this.maqBean = maqBean;
	}

	public OrdenProduccion getOrdenProd() {
		return ordenProd;
	}

	public void setOrdenProd(OrdenProduccion ordenProd) {
		this.ordenProd = ordenProd;
	}

	public Maquina getImpMaquina() {
		return impMaquina;
	}

	public void setImpMaquina(Maquina impMaquina) {
		this.impMaquina = impMaquina;
	}

	public Maquina getConfMaquina() {
		return confMaquina;
	}

	public void setConfMaquina(Maquina confMaquina) {
		this.confMaquina = confMaquina;
	}

	public List<InvRawMaterialsV> getMateriaPrimaAutocomp() {
		return materiaPrimaAutocomp;
	}

	public void setMateriaPrimaAutocomp(List<InvRawMaterialsV> materiaPrimaAutocomp) {
		this.materiaPrimaAutocomp = materiaPrimaAutocomp;
	}

	public InvRawMaterialsV getMateriaPrimaSelec() {
		return materiaPrimaSelec;
	}

	public void setMateriaPrimaSelec(InvRawMaterialsV materiaPrimaSelec) {
		this.materiaPrimaSelec = materiaPrimaSelec;
	}

}
